import { logger } from './logger';
import config from '../config/env';

/**
 * 邮件模板接口
 */
interface EmailTemplate {
  subject: string;
  html: string;
  text: string;
}

/**
 * 生成密码重置邮件模板
 */
export const generateResetPasswordTemplate = (
  name: string, 
  resetLink: string, 
  expiryHours: number = 6
): EmailTemplate => {
  const subject = '密码重置请求 - 教案管理平台';
  
  const html = `
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>密码重置</title>
      <style>
        body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; }
        .header { background-color: #4CAF50; color: white; padding: 20px; text-align: center; }
        .content { padding: 20px; background-color: #f9f9f9; }
        .button { 
          display: inline-block; 
          padding: 12px 24px; 
          background-color: #4CAF50; 
          color: white; 
          text-decoration: none; 
          border-radius: 5px; 
          margin: 20px 0;
        }
        .footer { padding: 20px; text-align: center; color: #666; font-size: 14px; }
        .warning { background-color: #fff3cd; border: 1px solid #ffeaa7; padding: 10px; border-radius: 5px; margin: 15px 0; }
      </style>
    </head>
    <body>
      <div class="container">
        <div class="header">
          <h1>密码重置请求</h1>
        </div>
        <div class="content">
          <p>亲爱的 ${name}，</p>
          <p>我们收到了您的密码重置请求。如果这是您本人操作，请点击下方按钮重置密码：</p>
          
          <div style="text-align: center;">
            <a href="${resetLink}" class="button">重置密码</a>
          </div>
          
          <p>或者复制以下链接到浏览器中打开：</p>
          <p style="word-break: break-all; background-color: #e9ecef; padding: 10px; border-radius: 3px;">
            ${resetLink}
          </p>
          
          <div class="warning">
            <strong>安全提醒：</strong>
            <ul>
              <li>此链接将在 ${expiryHours} 小时后过期</li>
              <li>如果您没有请求密码重置，请忽略此邮件</li>
              <li>请勿将此链接分享给他人</li>
            </ul>
          </div>
        </div>
        <div class="footer">
          <p>此邮件由系统自动发送，请勿回复。</p>
          <p>© 2025 教案管理平台 - 保留所有权利</p>
        </div>
      </div>
    </body>
    </html>
  `;
  
  const text = `
    亲爱的 ${name}，
    
    我们收到了您的密码重置请求。如果这是您本人操作，请访问以下链接重置密码：
    
    ${resetLink}
    
    安全提醒：
    - 此链接将在 ${expiryHours} 小时后过期
    - 如果您没有请求密码重置，请忽略此邮件
    - 请勿将此链接分享给他人
    
    此邮件由系统自动发送，请勿回复。
    © 2025 教案管理平台
  `;
  
  return { subject, html, text };
};

/**
 * 模拟邮件发送（开发环境）
 */
export const sendEmailMock = async (
  to: string, 
  template: EmailTemplate
): Promise<boolean> => {
  try {
    logger.info('模拟邮件发送', { 
      to, 
      subject: template.subject,
      environment: config.NODE_ENV 
    });
    
    if (config.NODE_ENV === 'development') {
      console.log('='.repeat(60));
      console.log('📧 模拟邮件发送');
      console.log('='.repeat(60));
      console.log(`收件人: ${to}`);
      console.log(`主题: ${template.subject}`);
      console.log('内容:');
      console.log(template.text);
      console.log('='.repeat(60));
    }
    
    return true;
  } catch (error: any) {
    logger.error('邮件发送失败', { to, error: error.message });
    return false;
  }
};

/**
 * 真实邮件发送（生产环境）
 * 这里可以集成 NodeMailer、SendGrid、阿里云邮件等服务
 */
export const sendEmailReal = async (
  to: string, 
  template: EmailTemplate
): Promise<boolean> => {
  try {
    // 检查邮件配置
    if (!config.SMTP_HOST || !config.SMTP_USER || !config.SMTP_PASS) {
      logger.warn('邮件配置不完整，使用模拟发送');
      return sendEmailMock(to, template);
    }
    
    // TODO: 实现真实的邮件发送
    // 可以使用 nodemailer 等库
    logger.info('真实邮件发送功能待实现', { to });
    
    // 暂时返回模拟发送
    return sendEmailMock(to, template);
  } catch (error: any) {
    logger.error('邮件发送失败', { to, error: error.message });
    return false;
  }
};

/**
 * 发送邮件的主函数
 */
export const sendEmail = async (
  to: string, 
  template: EmailTemplate
): Promise<boolean> => {
  if (config.NODE_ENV === 'development') {
    return sendEmailMock(to, template);
  } else {
    return sendEmailReal(to, template);
  }
};